/**
 * @file QWF_Usart.h
 * @brief QWF框架串口通信模块头文件（包含VOFA数据交互、DMA双缓冲接收等功能）
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-07
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @par 修改日志:
 * - 2025-08-07: 初始版本，定义串口通信相关结构体、函数及VOFA交互宏
 * 
 * @bug 待解决问题: 暂无已知问题
 */
#ifndef QWF_Usart_h
#define QWF_Usart_h

#include "stdint.h"    // 标准整数类型定义（如uint8_t）
#include "usart.h"     // HAL库串口驱动头文件（包含UART_HandleTypeDef等结构体）
#include "QWF_Cmd.h"   // QWF命令模块头文件（确认是否使能debug模式）
#include "string.h"    // 字符串操作函数（如memcpy）

/**
 * @brief VOFA数据交互最大波形数量宏（可显示的最大实时波形通道数）
 * @note 实际使用时需根据VOFA软件配置调整，避免超出显示限制
 */
#define vofa_data_num	100

/**
 * @brief VOFA数据交互结构体（管理串口接收/发送数据及显示模式）
 * @note 通过双缓冲实现DMA接收，支持波形显示和命令模式两种发送方式
 */
typedef struct{
	struct{
		uint8_t buffer[2][100];  // 双缓冲接收区（buffer[0]和buffer[1]交替使用）
	}rx;    					// 串口接收相关成员
	struct{
		enum{					// 发送模式枚举（波形显示或命令传输）
			waveform=0,    		// 波形模式（实时显示数据曲线）
			cmd,           		// 命令模式（发送控制指令）
		}mode;
		struct{
			uint8_t index;   		// 当前波形通道索引（用于Add_Data_To_Vofa宏）
			struct{
				char name[40];   		// 波形名称（显示于VOFA界面）
				float* meas_p;   		// 指向待显示数据的指针（实时更新）
			}waveform[vofa_data_num];  // 波形数据数组（最大vofa_data_num个通道）
			char cmd[10];    		// 命令模式下的指令缓冲区
		}data;
	}tx;    					// 串口发送相关成员
}vofa_t;

/**
 * @brief VOFA结构体实例指针（外部可通过此指针访问VOFA数据）
 */
extern vofa_t* vofa;

/*-------------------------------串口dma双缓冲idle相关函数----------------------------------------------------------- */
/**
 * @brief 串口dma双缓冲idle初始化
 */
void QWF_double_buffer_dma_idle_Init(UART_HandleTypeDef* huart,DMA_HandleTypeDef*hdma,uint8_t*buffer_1,uint8_t* buffer_2,uint32_t buffer_len);
/**
 * @brief 串口dma双缓冲idle中断回调函数（处理接收完成后的数据）
 */
void QWF_double_buffer_dma_idle_callback(UART_HandleTypeDef* huart,DMA_HandleTypeDef*hdma,uint32_t buffer_len,void (*callback)(uint8_t* pData));

/**
 * @brief 初始化VOFA数据交互模块（配置初始参数）
 * @note 需在主函数初始化阶段调用（如SystemInit()后）
 */
/*---------------------------vofa相关函数------------------------------------------------------------------------------------*/
/**
 * @brief vofa初始化
 */
void VOFA_Init(void);
/**
 * @brief VOFA数据回调函数（用于周期性发送数据至串口）
 */
void vofa_callback(void);

/**
 * @brief 向串口发送数据（通用发送函数）
 */
void Send_Data_To_USART(UART_HandleTypeDef * huart,uint8_t*data,uint16_t data_Byte );//先用sizeof（data）/sizeof(uint8_t)求出长度
/**
 * @brief 调试模式下将数据添加到VOFA显示（波形模式）
 * @param data_from 待显示数据的来源（如传感器采集值）
 * @param data_name 波形名称（用于VOFA界面显示）
 * @note 仅在debug宏定义为QWF_Enable时生效，发布版本自动禁用
 */
#if debug==QWF_Enable
	#define Add_Data_To_Vofa(data_from,data_name)\
	do{\
		static _Bool init=1;		/* 初始化标志（确保每个数据仅注册一次）*/\
		static float  data_name##_data;	/* 静态变量存储数据（避免临时变量丢失）*/\
		 data_name##_data=data_from;	/* 更新数据值*/\
		if(init){				/* 首次调用时注册数据*/\
			vofa->tx.data.waveform[vofa->tx.data.index].meas_p=&data_name##_data;	/* 绑定数据指针*/\
			memcpy(vofa->tx.data.waveform[vofa->tx.data.index].name,#data_name,sizeof(#data_name));	/* 设置波形名称*/\
			init=0;				/* 清除初始化标志*/\
			vofa->tx.data.index++;		/* 索引递增（指向下一个波形通道）*/\
		}\
	}while(0);
#else
	#define Add_Data_To_Vofa(data_from)  // 非调试模式下无操作
#endif

#endif
